package com.czk.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author:ChenZhangKun
 * @Date: 2021/12/9 11:56
 */
object Spark10_RDD_Operator_Transform {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(1, 2, 3, 4), 2)

    // 分组函数，根据计算的key进行分组
    // groupBy会将数据打乱，重新组合 成为shuffle
    // 将数据根据指定的规则进行分组, 分区默认不变，但是数据会被打乱重新组合，我们将这样
    // 的操作称之为 shuffle。极限情况下，数据可能被分在同一个分区中
    def groupFunction(num: Int): Int = {
      num % 2
    }

    def groupFunction2(num: Int): Int = {
      num
    }

    val groupRDD = rdd.groupBy(groupFunction)
    val value: RDD[(Int, Iterable[Int])] = rdd.groupBy(groupFunction2)
    // (0,CompactBuffer(2, 4))
    // (1,CompactBuffer(1, 3))
    groupRDD.collect().foreach(println)
    value.collect().foreach(println)
    sc.stop()
  }
}
